home *** CD-ROM | disk | FTP | other *** search
- Library MapURL;
-
- // Header conversion by Stephen Genusa <steveg@onramp.net> 06/08/96. Thanks!!! MWT
-
- Uses
- SysUtils, Windows, Parser;
-
- const
- HTTP_FILTER_MAJOR = 1; { major version of this spec }
- HTTP_FILTER_MINOR = 0; { minor version of this spec }
- SF_MAX_USERNAME = 257;
- SF_MAX_PASSWORD = 257;
- SF_MAX_FILTER_DESC_LEN = 257;
-
- // SF_STATUS_TYPE
- SF_STATUS_TYPE = $8000000; { base value }
- SF_STATUS_REQ_FINISHED = SF_STATUS_TYPE;
- SF_STATUS_REQ_FINISHED_KEEP_CONN = SF_STATUS_TYPE + 1;
- SF_STATUS_REQ_NEXT_NOTIFICATION = SF_STATUS_TYPE + 2;
- SF_STATUS_REQ_HANDLED_NOTIFICATION = SF_STATUS_TYPE + 3;
- SF_STATUS_REQ_ERROR = SF_STATUS_TYPE + 4;
- SF_STATUS_REQ_READ_NEXT = SF_STATUS_TYPE + 5;
- SF_NOTIFY_SECURE_PORT = $00000001;
- SF_NOTIFY_NONSECURE_PORT = $00000002;
- SF_NOTIFY_READ_RAW_DATA = $00008000;
- SF_NOTIFY_PREPROC_HEADERS = $00004000;
- SF_NOTIFY_AUTHENTICATION = $00002000;
- SF_NOTIFY_URL_MAP = $00001000;
- SF_NOTIFY_SEND_RAW_DATA = $00000400;
- SF_NOTIFY_LOG = $00000200;
- SF_NOTIFY_END_OF_NET_SESSION = $00000100;
- SF_NOTIFY_ORDER_HIGH = $00080000;
- SF_NOTIFY_ORDER_MEDIUM = $00040000;
- SF_NOTIFY_ORDER_LOW = $00020000;
- SF_NOTIFY_ORDER_DEFAULT = SF_NOTIFY_ORDER_LOW;
- SF_NOTIFY_ORDER_MASK = (SF_NOTIFY_ORDER_HIGH or SF_NOTIFY_ORDER_MEDIUM or SF_NOTIFY_ORDER_LOW);
-
-
-
- type
- PVOID = Pointer;
- LPVOID = Pointer;
- PCardinal = ^Cardinal;
- SF_REQ_TYPE = (SF_REQ_SEND_RESPONSE_HEADER, SF_REQ_ADD_HEADERS_ON_DENIAL,
- SF_REQ_SET_NEXT_READ_SIZE, SF_REQ_SET_PROXY_INFO);
-
- TFuncPlaceHolder = POINTER;
-
- THTTP_FILTER_CONTEXT = record
- cbSize : DWORD;
- Revision : DWORD;
- ServerContext : PVOID;
- ulReserved : DWORD;
- fIsSecurePort : BOOL;
- pFilterContext : PVOID;
- GetServerVariable : TFuncPlaceHolder; {TGetServerVariable;}
- AddResponseHeaders : TFuncPlaceHolder; {TAddResponseHeaders;}
- WriteClient : TFuncPlaceHolder; {TWriteClient;}
- AllocMen : TFuncPlaceHolder; {TAllocMem;}
- ServerSupportFunc : TFuncPlaceHolder; {TServerSupportFunc;}
- end;
-
- HTTP_FILTER_CONTEXT = THTTP_FILTER_CONTEXT;
- PHTTP_FILTER_CONTEXT = ^HTTP_FILTER_CONTEXT;
-
- TGetServerVariable = Function(var pfc : THTTP_FILTER_CONTEXT;
- VariableName : PChar;
- Buffer : PChar;
- var BuffSize : DWORD) : BOOL; StdCall;
-
- TAddResponseHeaders = Function(var pfc : THTTP_FILTER_CONTEXT;
- Headers : PChar;
- Reserved : DWORD) : BOOL; StdCall;
-
- TWriteClient = Function(var pfc : THTTP_FILTER_CONTEXT;
- Buffer : LPVOID;
- dwBytes : LPDWORD;
- Reserved : DWORD) : BOOL; StdCall;
-
- TAllocMem = Procedure(var pfc : THTTP_FILTER_CONTEXT;
- cbSize : DWORD;
- dwReserved : DWORD); StdCall;
-
-
- TServerSupportFunc = Function(var pfc : THTTP_FILTER_CONTEXT;
- sfReq : SF_REQ_TYPE;
- pData : PVOID;
- ul1 : DWORD;
- ul2 : DWORD) : BOOL; StdCall;
-
-
-
- THTTP_FILTER_RAW_DATA = record
- pvInData : PVOID;
- cbInData : DWORD;
- cbInBuffer : DWORD;
- dwReserved : DWORD;
- end;
-
- HTTP_FILTER_RAW_DATA = THTTP_FILTER_RAW_DATA;
- PHTTP_FILTER_RAW_DATA = ^HTTP_FILTER_RAW_DATA;
-
-
-
- TGetHeader = Function(var pfc : THTTP_FILTER_CONTEXT;
- lpszName : PChar;
- lpvBuffer : LPVOID;
- lpdwSize : LPDWORD) : BOOL; StdCall;
-
-
-
- TSetHeader = Function(var pfc : THTTP_FILTER_CONTEXT;
- lpszName : PChar;
- lpszValue : PChar) : BOOL; StdCall;
-
-
-
- TAddHeader = Function(var pfc : THTTP_FILTER_CONTEXT;
- lpszName : PChar;
- lpszValue : PChar) : BOOL; StdCall;
-
-
- THTTP_FILTER_PREPROC_HEADERS = record
- GetHeader : TGetHeader;
- SetHeader : TSetHeader;
- AddHeader : TAddHeader;
- dwReserved : DWORD;
- end;
-
- HTTP_FILTER_PREPROC_HEADERS = THTTP_FILTER_PREPROC_HEADERS;
- PHTTP_FILTER_PREPROC_HEADERS = ^HTTP_FILTER_PREPROC_HEADERS;
-
- THTTP_FILTER_AUTHENT = record
- pszUser : PChar;
- cbUserBuff : DWORD;
- pszPassword : PChar;
- cbPasswordBuff : DWORD;
- end;
-
- HTTP_FILTER_AUTHENT = THTTP_FILTER_AUTHENT;
- PHTTP_FILTER_AUTHENT = ^HTTP_FILTER_AUTHENT;
-
- THTTP_FILTER_URL_MAP = record
- pszURL : PChar;
- pszPhysicalPath : PChar;
- cbPathBuff : DWORD;
- end;
-
- HTTP_FILTER_URL_MAP = THTTP_FILTER_URL_MAP;
- PHTTP_FILTER_URL_MAP = ^HTTP_FILTER_URL_MAP;
-
- THTTP_FILTER_LOG = record
- pszClientHostName : PChar;
- pszClientUserName : PChar;
- pszServerName : PChar;
- pszOperation : PChar;
- pszTarget : PChar;
- pszParameters : PChar;
- dwHttpStatus : DWORD;
- dwWin32Status : DWORD;
- end;
-
- HTTP_FILTER_LOG = THTTP_FILTER_LOG;
- PHTTP_FILTER_LOG = ^HTTP_FILTER_LOG;
-
- THTTP_FILTER_VERSION = record
- dwServerFilterVersion : DWORD;
- dwFilterVersion : DWORD;
- lpszFilterDesc : array [0..(SF_MAX_FILTER_DESC_LEN-1)] of Char;
- dwFlags : DWORD;
- end;
-
- HTTP_FILTER_VERSION = THTTP_FILTER_VERSION;
- PHTTP_FILTER_VERSION = ^HTTP_FILTER_VERSION;
-
- TFilter=class
- public
- procedure AssignContext(var thisFC: HTTP_FILTER_CONTEXT);
- function GetServerVar(varName: String): String;
- private
- pFC: PHTTP_FILTER_CONTEXT;
- end;
-
- // *******************
- // Start of code
- // *******************
-
- procedure TFilter.AssignContext(var thisFC: HTTP_FILTER_CONTEXT);
- begin
- pFC:=@thisFC;
- end;
-
- function TFilter.GetServerVar(varName: String): String;
- var
- ss: ShortString;
- buf: array[0..255] of char absolute ss;
- len: Integer;
- FNGetServerVariable: TGetServerVariable;
- begin
- len:=255;
- @FNGetServerVariable:=pFC^.GetServerVariable;
- if FNGetServerVariable(pFC^, PChar(varName), Pointer(@buf[1]), len ) then
- begin
- ss[0]:=Char(len);
- result:=ss;
- end
- else
- Result:='<UNKNOWN>';
- end;
-
-
- Function GetFilterVersion(var pVer : HTTP_FILTER_VERSION) : BOOL; export; stdcall;
- begin
- pVer.dwFilterVersion := MAKELONG(0, 1);
- StrPCopy(pVer.lpszFilterDesc, 'Re-map URL version 0.2.');
- pVer.dwFlags := (SF_NOTIFY_URL_MAP);
- result := True;
- end;
-
- function RemapURL(const url: String): String;
- var
- f: TextFile;
- bufLen: Integer;
- path: String[255];
- lineBuf: String;
- inURL: String;
- outURL: String;
- begin
- Result:='';
-
- // Create a data file in the same directory the DLL itself resides.
- bufLen:=GetModuleFileName( GetModuleHandle('MAPURL.DLL'), PChar(@path[1]), 255);
- SetLength(path, bufLen);
-
- path:=ExtractFilePath(path)+'#urlmap.txt';
-
- // Create the file if it doesn't exist and load
- // it with some demo info
- if NOT FileExists(path) then
- begin
- AssignFile(f, path);
- try
- Rewrite(f);
- Writeln(f, '; INURL OUTURL');
- Writeln(f, '; remap.htm c:\autoexec.bat A request for remap.htm (in the server root) will send back your autoexec.bat file');
- Writeln(f, ';');
- Writeln(f, '; DELETE THIS NEXT LINE!!! It is for demo purposes only');
- Writeln(f, 'remap.htm c:\autoexec.bat');
- CloseFile(f);
- except
- ;
- end;
- exit;
- end;
-
- AssignFile(f, path);
- try
- Reset(f);
- try
- while (not EOF(f)) do
- begin
- // Read a line
- Readln(f, lineBuf);
-
- // Skip if it's a comment
- if (Length(lineBuf)>0) AND (lineBuf[1]=';') then
- continue;
-
- // Parse
- inURL:=UpperCase(GetToken(lineBuf, 1, [' ']));
- outURL:=UpperCase(GetToken(lineBuf, 2, [' ']));
-
- // Should we remap?
- if Pos(inURL, url)=1 then
- begin
- Result:=outURL+Copy(url, Length(inURL)+1, 255);
- break;
- end;
- end;
- finally
- CloseFile(f);
- end;
- except
- ;
- end;
-
- end;
-
-
-
- Function HttpFilterProc(var pfc : HTTP_FILTER_CONTEXT; NotificationType : DWORD; pvNotification : LPVOID) : DWORD; export; stdcall;
- var
- filter: TFilter;
-
- function OnURLMap : DWORD;
- var
- mapStruct: PHTTP_FILTER_URL_MAP;
- url: String;
- begin
- result := SF_STATUS_REQ_NEXT_NOTIFICATION;
-
- mapStruct:=PHTTP_FILTER_URL_MAP(pvNotification);
-
- // Extract the path info we need to try and map
- url:=UpperCase( String(mapStruct.pszURL) );
-
- // Does this map?
- url:=RemapURL(url);
-
- // If it maps, then copy it
- if url<>'' then
- StrCopy(mapStruct.pszPhysicalPath, PChar(url) );
- end;
-
-
- begin
- result:=SF_STATUS_REQ_NEXT_NOTIFICATION;
- //Exit;
-
- try
- filter:=TFilter.Create;
-
- filter.AssignContext(pfc);
-
- Case NotificationType of
- SF_NOTIFY_URL_MAP:
- begin
- result:=OnURLMap;
- end;
- end;
- filter.Free;
- except
- ;
- end;
- end;
-
-
-
-
-
- exports
-
- HttpFilterProc,
-
- GetFilterVersion;
-
-
-
-
-
- end.
-
-
-
-